#include <iostream>
// #include <thread>
// #include <unistd.h>
// #include <string>
// #include <cerrno>
// #include <string.h>
#include "Thread.hpp"
using namespace ThreadModule;

void print(int& num)
{
   // int cnt = 10;
    while (num)
    {
        //std::cout << "hello I am myself thread, num: " << num-- << std::endl;
        std::cout << "hello I am myself thread, num: " << num-- <<std::endl;
        sleep(1);
    }
}

int main()
{
    int c = 10;
    Thread<int> t1(print, c);
    //Thread<int> t1(print, 10);
    t1.Start();
    std::cout << "name: " << t1.name() << std::endl;
    t1.Join();
    return 0;
}

// std::string ToHex(pthread_t tid)
// {
//     char id[64];
//     snprintf(id, sizeof(id), "0x%lx", tid);
//     return id;
// }

// __thread int g_val = 100;

// void *threadrun1(void *args)
// {
//     pthread_detach(pthread_self());
//     std::string name = static_cast<const char *>(args);
//     int cnt = 5;
//     while (cnt)
//     {
//         sleep(1);
//         // std::cout << "I am a new thread ..." << getpid() << std::endl;
//         // printf("getpid: %d cnt: %d &cnt: %p\n",getpid(),cnt,&cnt);
//         printf("threadname: %s g_val: %d &g_val: %p\n", name.c_str(), g_val, &g_val);
//         g_val--;
//         cnt--;
//     }
//     return nullptr;
// }

// void *threadrun2(void *args)
// {
//     pthread_detach(pthread_self());
//     std::string name = static_cast<const char *>(args);
//     int cnt = 5;
//     while (cnt)
//     {
//         // std::cout << "I am a new thread ..." << getpid() << std::endl;
//         // printf("getpid: %d cnt: %d &cnt: %p\n",getpid(),cnt,&cnt);
//         printf("threadname: %s g_val: %d &g_val: %p\n", name.c_str(), g_val, &g_val);
//         sleep(1);

//         cnt--;
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid1;
//     pthread_t tid2;

//     pthread_create(&tid1, nullptr, threadrun1, (void *)"thread-1");
//     pthread_create(&tid2, nullptr, threadrun2, (void *)"thread-2");

//     // pthread_detach(tid);
//     //  int cnt = 5;

//     pthread_join(tid1, nullptr);
//     pthread_join(tid2, nullptr);

//     // std::cout<< "new thread tid"<< ":"<<tid <<":"<<ToHex(tid)<<std::endl;
//     // std::cout<< "main thread tid"<< ":"<<pthread_self() <<":"<<ToHex(pthread_self())<<std::endl;

//     // while (true)
//     // {
//     //     sleep(1);
//     //     if (!(cnt--))
//     //     {
//     //         break;
//     //     }

//     //     std::cout << "I am a main thread ..." << getpid() << std::endl;
//     // }

//     // std::cout << "I am a main thread wait block" << getpid() << std::endl;
//     // sleep(1);
//     // int n = pthread_join(tid, nullptr);
//     // std::cout << "main thread wait return n:" << n << ":" << strerror(n) << std::endl;

//     return 0;
// }

// void threadrun(int num)
// {
//     while(num--)
//     {
//         sleep(1);
//         std::cout<<"i am new thread... num:"<< num <<std::endl;
//     }
// }

// int main()
// {
//     std::thread t1(threadrun,10);
//     std::thread t2(threadrun,10);
//     std::thread t3(threadrun,10);
//     std::thread t4(threadrun,10);

//     while(true)
//     {
//         sleep(1);
//         std::cout<<"i am main thread... "<<std::endl;
//     }

//     t1.join();
//     t2.join();
//     t3.join();
//     t4.join();

//     return 0;
// }